gdk/wayland: Take transform into account when setting physical size
authorGuido Günther <agx@sigxcpu.org>
Wed, 5 May 2021 11:59:26 +0000 (13:59 +0200)
committerGuido Günther <agx@sigxcpu.org>
Wed, 5 May 2021 12:55:07 +0000 (14:55 +0200)
Width and height of a GdkMonitor are derived via wl_output which
talks about physical dimensions of a device and compositors usually
implement this as the untransformed values (e.g. weston, wlroots).

Since the GTK client has no way to figure out if a monitor was rotated,
transform the physical dimensions according to the applied wayland
transform to have the physical dimensions match the logical ones.

Mutter flips the physical dimensions itself but doesn't announce the
transform so this shouldn't break anything there.

gdk/wayland/gdkdisplay-wayland.c

index 41b2069a77a096fb9b5f925ce5a4a4951596fcdc..34fbf234c410704ab648ef4595ecf1be017b4406 100644 (file)
@@ -2380,7 +2380,21 @@ output_handle_geometry (void             *data,
 
   monitor->x = x;
   monitor->y = y;
-  gdk_monitor_set_physical_size (GDK_MONITOR (monitor), physical_width, physical_height);
+
+  switch (transform)
+    {
+    case WL_OUTPUT_TRANSFORM_90:
+    case WL_OUTPUT_TRANSFORM_270:
+    case WL_OUTPUT_TRANSFORM_FLIPPED_90:
+    case WL_OUTPUT_TRANSFORM_FLIPPED_270:
+      gdk_monitor_set_physical_size (GDK_MONITOR (monitor),
+                                    physical_height, physical_width);
+      break;
+    default:
+      gdk_monitor_set_physical_size (GDK_MONITOR (monitor),
+                                    physical_width, physical_height);
+    }
+
   gdk_monitor_set_subpixel_layout (GDK_MONITOR (monitor), subpixel);
   gdk_monitor_set_manufacturer (GDK_MONITOR (monitor), make);
   gdk_monitor_set_model (GDK_MONITOR (monitor), model);